package socket

import (
	"regexp"
	"strings"

	"github.com/cloudwego/hertz/pkg/common/hlog"
)

// 提前编译常用正则表达式，避免重复编译影响性能
var (
	// 敏感信息正则
	phoneRegex      = regexp.MustCompile(`^1[3-9]\d{9}$`)
	idCardRegex     = regexp.MustCompile(`^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$`)
	creditCardRegex = regexp.MustCompile(`^\d{13,19}$`)
	iccidRegex      = regexp.MustCompile(`^[0-9]{10,30}$`) // 预编译ICCID正则

	// 异常字符正则：空字节、控制字符(除回车换行制表符)
	badCharsRegex = regexp.MustCompile(`[\x00\x01-\x08\x0B\x0C\x0E-\x1F\x7F]`)
	//modbus 线圈启动命令
)

// isIllegalData 检测数据是否为非法数据（增强版） 显示非法数据原数据
func (s *TcpServer) isIllegalData(dataStr, remoteAddr string) bool {
	// 规则1: 数据长度超过1MB
	if len(dataStr) > 1024*1024 {
		hlog.Debugf("非法数据: 长度超过1MB, 客户端: %s", remoteAddr)
		return true
	}

	// 规则2: 包含SQL注入特征（增强版）
	sqlPatterns := []string{
		"UNION SELECT", "DROP TABLE", "INSERT INTO", "DELETE FROM",
		"EXEC(", "xp_cmdshell", "UPDATE ", "ALTER ", "CREATE ",
		"OR 1=1", "--", "#", "/*", "*/", "DECLARE ", "CAST(", "CONVERT(",
	}
	upperData := strings.ToUpper(dataStr)
	for _, pattern := range sqlPatterns {
		if strings.Contains(upperData, pattern) {
			hlog.Debugf("非法数据: 包含SQL注入特征 '%s', 客户端: %s, 数据: %s", pattern, remoteAddr, dataStr)
			return true
		}
	}

	// 规则3: 未认证连接发送非ICCID格式数据（使用预编译正则）
	if _, ok := s.manager.temp.Load(remoteAddr); ok {
		if !iccidRegex.MatchString(dataStr) {
			hlog.Debugf("非法数据: 未认证连接发送非ICCID格式, 客户端: %s, 数据: %s", remoteAddr, dataStr)
			return true
		}
	}

	// 规则4: 包含XSS攻击特征
	xssPatterns := []string{
		"<script>", "onerror=", "onclick=", "onload=",
		"<img src=x onerror=", "javascript:", "eval(",
		"document.cookie", "<iframe", "<svg onload=",
	}
	lowerData := strings.ToLower(dataStr)
	for _, pattern := range xssPatterns {
		if strings.Contains(lowerData, pattern) {
			hlog.Debugf("非法数据: 包含XSS特征 '%s', 客户端: %s, 数据: %s", pattern, remoteAddr, dataStr)
			return true
		}
	}

	// 规则5: 包含命令注入特征
	cmdPatterns := []string{
		";", "&&", "||", "|", "`", "$(",
		"rm ", "ls ", "cat ", "chmod ", "sudo ",
		"system(", "exec(", "passthru(",
	}
	for _, pattern := range cmdPatterns {
		if strings.Contains(dataStr, pattern) {
			hlog.Debugf("非法数据: 包含命令注入特征 '%s', 客户端: %s", pattern, remoteAddr)
			return true
		}
	}

	// 规则6: 包含路径遍历特征
	if strings.Contains(dataStr, "../") || strings.Contains(dataStr, "..\\") {
		hlog.Debugf("非法数据: 包含路径遍历特征, 客户端: %s", remoteAddr)
		return true
	}

	// 规则7: 包含敏感信息（未授权情况下）
	if _, ok := s.manager.temp.Load(remoteAddr); ok { // 未认证连接禁止发送敏感信息
		if phoneRegex.MatchString(dataStr) || idCardRegex.MatchString(dataStr) || creditCardRegex.MatchString(dataStr) {
			hlog.Debugf("非法数据: 未认证连接包含敏感信息, 客户端: %s", remoteAddr)
			return true
		}
	}

	// 规则8: 包含异常字符（空字节、控制字符等）
	//if badCharsRegex.MatchString(dataStr) {
	//	hlog.Debugf("非法数据: 包含异常控制字符, 客户端: %s", remoteAddr)
	//	return true
	//}

	return false
}
